package org.liang.job.repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.liang.jdbc.repository.BaseRepository;
import org.liang.job.common.IDBuilder;
import org.springframework.stereotype.Repository;

/**
 * 自动任务日志操作.
 * 
 * <pre>
 * 提供以下行为：
 * 1. 保存日志
 * 2. 查询所有日志
 * 3. 按组查询日志
 * 4. 按组、任务状态查询日志
 * </pre>
 * 
 * @author L.Yang
 * @version 1.0, 2015年9月23日
 */
@Repository("taskLogRepository")
public class TaskLogRepository extends BaseRepository {

    /**
     * 保存任务执行情况.
     * 
     * @param title
     *            任务标题
     * @param groupId
     *            任务组编号
     * @param biz
     *            任务执行逻辑实现类
     * @param params
     *            任务参数
     * @param status
     *            任务执行状态
     * @param message
     *            任务执行失败信息
     */
    public void save(String title, String groupId, String biz,
                     Map<String, Object> params, boolean status, String message) {
        String id = IDBuilder.buildUniqueID();
        saveJobLog(id, title, biz,
                        fetchGroupName(groupId), status, message);
        saveParamLog(id, params);
    }

    /**
     * 根据任务组编号 获取任务组名称.
     * 
     * @param groupId
     *            任务组编号
     * @return 任务组名称
     */
    private String fetchGroupName(String groupId) {
        String sql4group = "select t.NAME from TASK_JOB_GROUP t where t.ID = ?";
        return getJdbcTemplate().queryForObject(sql4group, String.class, groupId);
    }

    /**
     * 保存任务执行情况日志.
     * 
     * @param id
     *            任务编号
     * @param title
     *            任务标题
     * @param biz
     *            任务执行逻辑
     * @param group
     *            任务组
     * @param status
     *            任务状态
     * @param message
     *            任务执行信息
     */
    private void saveJobLog(String id, String title, String biz, String group, boolean status,
                            String message) {
        String sql4job = "insert into TASK_AUTO_JOB_LOG"
                         + " (ID, TITLE, GROUP_NAME, BIZ, JOB_STATUS, MESSAGE) values "
                         + buildPreparedStatement4Args(6);
        getJdbcTemplate().update(sql4job,
                        new Object[] {id, title, group, biz, String.valueOf(status), message});
    }

    /**
     * 保存任务参数.
     * 
     * @param id
     *            任务编号
     * @param params
     *            任务参数
     */
    private void saveParamLog(String id, Map<String, Object> params) {
        String sql4param = "insert into TASK_JOB_PARAM_LOG (ID, JOB_ID, P_KEY, P_VAL) values "
                           + buildPreparedStatement4Args(4);
        List<Object[]> batchArgs = new ArrayList<Object[]>();
        for (Map.Entry<String, Object> entry : params.entrySet()) {
            Object[] args =
                    new Object[] {IDBuilder.buildUniqueID(), id, entry.getKey(), entry.getValue()};
            batchArgs.add(args);
        }
        getJdbcTemplate().batchUpdate(sql4param, batchArgs);
    }

    /**
     * 查询所有日志数据.
     * 
     * @return 日志数据
     */
    public List<Map<String, Object>> query() {
        String sql = "select * from TASK_AUTO_JOB_LOG ";
        return getJdbcTemplate().queryForList(sql);
    }

    /**
     * 根据组 查询日志数据（支持模糊查询）.
     * 
     * @param group
     *            任务组
     * @return 日志数据
     */
    public List<Map<String, Object>> query(String group) {
        String sql = "select * from TASK_AUTO_JOB_LOG l where l.GROUP like '%?%' ";
        return getJdbcTemplate().queryForList(sql, group);
    }

    /**
     * 根据组、任务完成状态 查询日志数据.
     * 
     * @param group
     *            任务组（支持模糊查询）
     * @param status
     *            任务执行状态
     * @return 日志数据
     */
    public List<Map<String, Object>> query(String group, String status) {
        String sql = "select * from TASK_AUTO_JOB_LOG l "
                     + "where l.GROUP like '%?%' and l.JOB_STATUS = ? ";
        return getJdbcTemplate().queryForList(sql, new Object[] {group, status});
    }

    /**
     * 查询指定任务参数内容.
     * 
     * @param logid
     *            日志编号
     * @return 任务参数信息
     */
    public List<Map<String, Object>> queryParams(String logid) {
        String sql = "select * from TASK_JOB_PARAM_LOG l where l.job_id = ? ";
        return getJdbcTemplate().queryForList(sql, logid);
    }
}